interface GenericFunc {
  <T>(arg: T): Array<T>
}

let getArgArray: GenericFunc = function <U>(arg: U): Array<U> {
  return [arg];
}


class GenericObj<T> {
  attr: T;
  getArr: (arg1: T, arg2: T) => T[];
}

let strObj = new GenericObj<string>();
strObj.attr = 'Hello';
strObj.getArr = function(str1: string, str2: string): string[] {
  return [str1, str2];
}